package core;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collection;
import java.util.Optional;

import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ChoiceDialog;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextInputDialog;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;

/**
 * 对话框工具栏
 * @author self
 *
 */
public class AlertUtil {

	//禁止实例化
	private AlertUtil() {}

	/**
	 * 显示模态对话框
	 * @param type　类型
	 * @param title	标题
	 * @param header　提示语
	 * @param content　内容
	 * @return　选择的按钮类型　
	 */
	public static Optional<ButtonType> show(AlertType type,String title,
			String header,String content) {
		Alert alert=new Alert(type);
		alert.setTitle(title);
		alert.setHeaderText(header);
		alert.setContentText(content);

		SceneFactory.autoScalePanel(alert.getDialogPane());

		return alert.showAndWait();
	}

	/**
	 * 显示模态对话框
	 * @param type 类型
	 * @param title　标题
	 * @param content　内容
	 * @return 选择的按钮类型
	 */
	public static Optional<ButtonType> show(AlertType type,String title,String content) {
		return show(type,title,null,content);
	}

	/**
	 * 显示模态对话框
	 * @param type　类型
	 * @param content　内容
	 * @return　选择的按钮类型
	 */
	public static Optional<ButtonType> show(AlertType type,String content) {
		return show(type,null,null,content);
	}

	/**
	 * 显示一般信息模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> info(String title,String header,String content) {
		return show(AlertType.INFORMATION,title,header,content);
	}

	/**
	 * 显示一般信息模态对话框
	 * @param title 标题
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> info(String title,String content) {
		return info(title,null,content);
	}

	/**
	 * 显示一般信息模态对话框
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> info(String content) {
		return info("消息",null,content);
	}

	/**
	 * 显示错误信息模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> error(String title,String header,String content) {
		return show(AlertType.ERROR,title,header,content);
	}

	/**
	 * 显示错误信息模态对话框
	 * @param title　标题
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> error(String title,String content) {
		return error(title,null,content);
	}

	/**
	 * 显示错误信息模态对话框
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> error(String content) {
		return error("错误",null,content);
	}

	/**
	 * 显示确认模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> confirm(String title,String header,String content) {
		return show(AlertType.CONFIRMATION,title,header,content);
	}

	/**
	 * 显示确认模态对话框
	 * @param title　标题
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> confirm(String title,String content) {
		return confirm(title,null,content);
	}

	/**
	 * 显示确认模态对话框
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> confirm(String content) {
		return confirm("确认",null,content);
	}

	/**
	 * 显示警告信息模态对话框
	 * @param title 标题
	 * @param header　提示语
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> warning(String title,String header,String content) {
		return show(AlertType.WARNING,title,header,content);
	}

	/**
	 * 显示警告信息模态对话框
	 * @param title 标题
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> warning(String title,String content) {
		return warning(title,null,content);
	}

	/**
	 * 显示警告信息模态对话框
	 * @param content　内容
	 * @return　选择按钮类型
	 */
	public static Optional<ButtonType> warning(String content) {
		return warning("警告",null,content);
	}

	/**
	 * 显示异常信息模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param e　异常
	 */
	public static void exception(String title,String header,Exception e) {
		Alert alert = new Alert(AlertType.ERROR);
		alert.setTitle(title);
		alert.setHeaderText(header);
		alert.setContentText(e.getMessage());

		SceneFactory.autoScalePanel(alert.getDialogPane());

		// Create expandable Exception.
		StringWriter sw = new StringWriter();
		PrintWriter pw = new PrintWriter(sw);
		e.printStackTrace(pw);
		String exceptionText = sw.toString();

		Label label = new Label("异常堆栈:");

		TextArea textArea = new TextArea(exceptionText);
		textArea.setEditable(false);
		textArea.setWrapText(true);

		textArea.setMaxWidth(Double.MAX_VALUE);
		textArea.setMaxHeight(Double.MAX_VALUE);
		GridPane.setVgrow(textArea, Priority.ALWAYS);
		GridPane.setHgrow(textArea, Priority.ALWAYS);

		GridPane expContent = new GridPane();
		expContent.setMaxWidth(Double.MAX_VALUE);
		expContent.add(label, 0, 0);
		expContent.add(textArea, 0, 1);

		// Set expandable Exception into the dialog pane.
		alert.getDialogPane().setExpandableContent(expContent);

		alert.showAndWait();
	}

	/**
	 * 显示异常信息模态对话框
	 * @param title　标题
	 * @param e　异常
	 */
	public static void exception(String title,Exception e) {
		exception(title,null,e);
	}

	/**
	 * 显示异常信息模态对话框
	 * @param e　异常
	 */
	public static void exception(Exception e) {
		exception("程序异常",null,e);
	}

	/**
	 * 显示选择模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param content　内容
	 * @param items　选择项集合
	 * @return　选择项
	 */
	public static Optional<String> choice(String title,String header,String content,Collection<String> items){
		ChoiceDialog<String> dialog = new ChoiceDialog<>(null,items);
		dialog.setTitle(title);
		dialog.setHeaderText(header);
		dialog.setContentText(content);

		SceneFactory.autoScalePanel(dialog.getDialogPane());

		return dialog.showAndWait();
	}

	/**
	 * 显示选择模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param items　选择项集合
	 * @return　选择项
	 */
	public static Optional<String> choice(String title,String header,Collection<String> items){
		return choice(title,header,null,items);
	}

	/**
	 * 显示选择模态对话框
	 * @param header　提示语
	 * @param items　选择项集合
	 * @return　选择项
	 */
	public static Optional<String> choice(String header,Collection<String> items){
		return choice("请选择",null,header,items);
	}

	/**
	 * 显示输入模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param content　内容
	 * @param value　默认值
	 * @return　输入内容
	 */
	public static Optional<String> input(String title,String header,String content,String value){
		TextInputDialog dialog = new TextInputDialog(value);
		dialog.setTitle(title);
		dialog.setHeaderText(header);
		dialog.setContentText(content);

		SceneFactory.autoScalePanel(dialog.getDialogPane());

		// Traditional way to get the response value.
		return dialog.showAndWait();
	}

	/**
	 * 显示输入模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @param value　默认值
	 * @return　输入内容
	 */
	public static Optional<String> input(String title,String header,String value){
		return input(title,header,null,value);
	}

	/**
	 * 显示输入模态对话框
	 * @param title　标题
	 * @param header　提示语
	 * @return　输入内容
	 */
	public static Optional<String> input(String title,String header){
		return input(title,header,null);
	}

	/**
	 * 显示输入模态对话框
	 * @param header　提示语
	 * @return　输入内容
	 */
	public static Optional<String> input(String header){
		return input("请输入",header,null);
	}
}
